﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace Single
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += Form1_Load;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            /*Singal单例模式和FlyWeight享元模式 都属于性能方面的设计模式
            单例模式分为两种：饿汉式和饱汉式，饿汉式是等需要用到的时候才去创建，
            饱汉式是类加载式就创建实例。
            现在单例模式写来写去写到最后，无非就是双If判断加互斥锁。再说这个就没意思了，
        
            在听老师讲课说双if判断的时候我就想，如果第一个线程获取锁，然后给了实例地址，但是没有
            执行完构造函数或者初始化还没有完成，这时候第二个线程来了，在判断是不是Null，（显然有地址就不是Null）,
            C# 对new关键字进行了优化，做成了原子操作。只要在lock中的if只有new操作 没有其他的复制和初始化操作，
            那么就会


            */
            string msg = "";
        }
    }
    public class Server
    {
        private static object Obj = new object();
        public static P pa;

        public static P GetIns()
        {
            if (pa == null)
            {
                lock (Obj)
                {
                    if (pa == null)
                    {
                        pa = new P("测试");
                    }
                }
            }

            return pa;
        }
    }

    public class Helper
    {
        public static ManualResetEvent ManualReset = new ManualResetEvent(false);
    }
    class P
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                Helper.ManualReset.Set();
                _name = value;
            }
        }

        public P(string name)
        {
            Name = name;
        }
    }
}
